package com.ruoyi.system.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 施工事项DO（对应t_project_item表）
 * 描述：存储项目各阶段下的具体施工任务信息，关联项目-阶段关联表
 */
@Data
@TableName("t_construction_project_item") // 数据库表名，需与实际表结构一致
public class ConstructionProjectItemDO {

    /**
     * 主键ID
     * 自增策略：与ProjectStageRelDO保持一致，使用数据库自增
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 施工项目ID
     * 关联表：t_construction_project（施工项目表）
     * 冗余存储：便于快速查询“某项目下的所有事项”，无需多表联查
     */
    @TableField("project_id")
    private Long projectId;

    /**
     * 阶段ID（关联项目-阶段关联表）
     * 关联表：t_project_stage_rel（项目-阶段关联表）
     * 核心关联字段：确定事项所属的具体阶段
     */
    @TableField("stage_id")
    private Long stageId;

    /**
     * 事项名称
     * 示例：水电改造、墙面刷漆、地砖铺设
     */
    @TableField("item_name")
    private String itemName;

    /**
     * 事项开始时间
     * 用于计算工期、判断是否逾期
     */
    @TableField("start_time")
    private LocalDate startTime;

    /**
     * 事项结束时间
     * 用于计算工期、判断是否逾期
     */
    @TableField("end_time")
    private LocalDate endTime;

    /**
     * 工期天数
     * 冗余字段：由start_time和end_time计算得出（结束时间-开始时间+1）
     * 用途：快速展示工期，避免前端重复计算
     */
    @TableField("duration_days")
    private Integer durationDays;

    /**
     * 事项完成状态
     * 枚举值：0-未开始，1-进行中，2-已完成
     * 核心状态字段：用于进度跟踪、阶段状态联动（如阶段下所有事项完成则阶段可标记为已完成）
     */
    @TableField("completion_status")
    private Integer completionStatus;

    /**
     * 业主协调内容
     * 用途：记录与业主沟通的待协调事项（如材料确认、进场时间、特殊工艺要求）
     */
    @TableField("owner_coordination")
    private String ownerCoordination;

    /**
     * 验收状态
     * 枚举值：0-未验收，1-已验收
     * 业务规则：仅“完成状态=2（已完成）”的事项可修改此状态
     */
    @TableField("is_accepted")
    private Integer isAccepted;

    /**
     * 验收内容
     */
    @TableField("accept_desc")
    private String acceptDesc;

    /**
     * 验收图片列表
     * 存储格式：JSON格式存储图片URL列表
     * 用途：记录验收过程中的现场图片，支持多张图片
     */
    @TableField("accept_images")
    private String acceptImages;

    /**
     * 备注
     * 用途：记录施工过程特殊情况（如材料临时变更、天气影响、工艺调整）
     */
    @TableField("remark")
    private String remark;

    /**
     * 沟通记录附件ID列表
     * 存储格式：用逗号分隔的附件ID字符串（如"1,2,3"）
     * 关联表：t_sys_attachment（系统附件表）
     * 用途：关联聊天截图、录音等沟通凭证，支持多端同步查看
     */
    @TableField("communication_attach_ids")
    private String communicationAttachIds;

    /**
     * 是否已推送消息通知
     * 枚举值：0-未推送，1-已推送
     * 业务规则：事项状态变更（如完成、验收）时触发消息推送，避免重复推送
     */
    @TableField("is_push_msg")
    private Integer isPushMsg;

    /**
     * 逻辑删除标识
     * 枚举值：0-未删除，1-已删除
     * 业务规则：删除前需校验是否有关联数据（如验收记录），避免误删
     */
    @TableLogic // MyBatis-Plus逻辑删除注解，自动拼接删除条件
    @TableField("is_deleted")
    private Integer isDeleted;

    /**
     * 创建时间（事项录入时间）
     * 自动填充：插入时由MyBatis-Plus填充器赋值
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间（事项状态/信息变更时间）
     * 自动填充：插入和更新时由MyBatis-Plus填充器赋值
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 创建人ID
     * 自动填充：记录事项的录入人，用于权限控制和操作日志
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 更新人ID
     * 自动填充：记录事项的最后修改人，用于权限控制和操作日志
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}